package com.wnxy.mallserver.listener;

import com.wnxy.mallserver.response.Prefix;
import com.wnxy.mallserver.util.OrderExpireUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.Topic;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * redis监听器的实现过程
 */

@Component
@Slf4j
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
    /**注入处理超时的工具*/
    @Resource
    private OrderExpireUtil orderExpireUtil;

    /**
     * 配置监听哪个频道
     * __keyevent：键的事件
     * @0__：redis中也有默认的数据库，有16个从0-15，目前监听的是第0个数据库（因为在redis中默认操作的是第0个）
     *      想要监听1数据库就改为@1__;想要监听所有就改为@*__
     * expired：值时expired，说明监听的是key过期的事件，也可以是其他值。
     */
    private static final Topic KEYEVENT_EXPIRED_TOPIC = new PatternTopic("__keyevent@0__:expired");

    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    /**
     * 注册监听器
     * @param listenerContainer
     */
    @Override
    protected void doRegister(RedisMessageListenerContainer listenerContainer) {
        // 频道可以是多个，多个传list
        listenerContainer.addMessageListener(this,KEYEVENT_EXPIRED_TOPIC);
    }

    /**
     * 当监听到有key失效，会自动调用该方法，获取失效的key
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
        // 获取失效的key
        String expiredKey = message.toString();
        log.debug(expiredKey);
        // 只获取失效的订单编号，通过前缀来判断
        if (expiredKey.startsWith(Prefix.ORDER)){
            //得到订单编号
            String orderno = expiredKey.split("_")[1];
            //处理该订单
            orderExpireUtil.handleExpire(orderno);//异步处理--线程池
        }

//        //倒计时结束到添加秒杀信息
//        if(expiredKey.startsWith("kill_start_")){
//            //获取秒杀id
//            int kid = Integer.parseInt(expiredKey.split("_")[2]);
//            orderExpireUtil.addKill(kid);
//        }
//        //过期时间到移除秒杀信息
//        if(expiredKey.startsWith("kill_end_")){
//            //获取秒杀id
//            int kid = Integer.parseInt(expiredKey.split("_")[2]);
//            orderExpireUtil.removeKill(kid);
//        }
    }
}



















